package reflect;

import java.io.OutputStream;
import java.lang.reflect.Method;
import java.util.Scanner;

/**
 * 反射机制
 * 反射是JAVA的动态机制,允许我们在程序运行期间确定对象的实例化操作,方法的调用和属性的操作等.
 * 反射可以提高代码灵活度,但是会有更多的系统开销和较慢的运行节奏.
 */
public class reflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        /*
            反射的第一步:获取要操作的类的对象
            Class类
            Class类成为类的类对象,JVM在加载一个类时会实例化一个Class实例与之对应
            通过这个Class实例中的提供的一系列方法我们可以在程序运行期间了解其表示的类的一切信息
            (类名,有哪些方法,构造器,属性等)以便进行操作.
            获取一个类的类对象的方式如下:
            1:类名.class
            如:
            class cls=String.class ; // 获取String的类对象
            class cls=int.class ; // 获取int的类对象

            2:Class.forName(String className)
            如:
            class cls=Class.forName("java.lang.String")
            3:类加载器Classloader获取

         */
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入一个类名:");
        String name=scanner.nextLine();
        Class cls = Class.forName(name);

        String className = cls.getName();
        System.out.println(className);

        className = cls.getSimpleName();
        System.out.println(className);

        className = cls.getCanonicalName();
        System.out.println(className);

        className = cls.getTypeName();
        System.out.println(className);

        Method[] methods = cls.getMethods();
        for (Method method : methods) {
            System.out.println("方法名"+method.getName());
           Class returnCls= method.getReturnType();//获取该方法的返回值类型
            System.out.println("该方法的返回值类型为"+returnCls.getName());
        }



    }
}
